import os
import subprocess

class AudioSpeedChanger:
    """
    使用 FFmpeg 批量调整音频播放速度的工具类
    支持多种音频格式，自动创建输出目录
    """

    def __init__(self, input_dir: str = "", output_dir: str = "", speed: float = 1.0):
        """
        初始化参数
        :param input_dir: 输入文件夹路径
        :param output_dir: 输出文件夹路径
        :param speed: 播放速度（float），例如 0.5=慢放，2.0=加快
        """
        self.input_dir = input_dir
        self.output_dir = output_dir
        self.speed = speed

    # ===================== Setter 方法 =====================
    def set_input_dir(self, path: str):
        """设置输入文件夹路径"""
        if not os.path.isdir(path):
            raise ValueError(f"❌ 输入文件夹不存在：{path}")
        self.input_dir = path

    def set_output_dir(self, path: str):
        """设置输出文件夹路径（自动创建）"""
        os.makedirs(path, exist_ok=True)
        self.output_dir = path

    def set_speed(self, speed: float):
        """设置播放速度（float）"""
        if speed <= 0:
            raise ValueError("❌ 播放速度必须大于0。")
        self.speed = speed

    # ===================== 主功能方法 =====================
    def change_audio_speed(self):
        """批量调整音频播放速度"""
        if not self.input_dir or not os.path.isdir(self.input_dir):
            raise ValueError("❌ 输入文件夹未设置或不存在。")
        if not self.output_dir:
            raise ValueError("❌ 输出文件夹未设置。")

        os.makedirs(self.output_dir, exist_ok=True)

        # 支持的音频格式
        valid_exts = ('.mp3', '.wav', '.flac', '.aac', '.ogg', '.m4a')

        for file_name in os.listdir(self.input_dir):
            if not file_name.lower().endswith(valid_exts):
                continue  # 跳过非音频文件

            input_path = os.path.join(self.input_dir, file_name)
            output_path = os.path.join(self.output_dir, file_name)

            # 构造 atempo 滤镜（分段处理，防止超出0.5~2.0范围）
            filters = []
            remaining = self.speed
            if 0.5 <= remaining <= 2.0:
                filters = [f"atempo={remaining}"]
            else:
                while remaining > 2.0:
                    filters.append("atempo=2.0")
                    remaining /= 2.0
                while remaining < 0.5:
                    filters.append("atempo=0.5")
                    remaining /= 0.5
                filters.append(f"atempo={remaining}")

            filter_str = ",".join(filters)

            # 构造 ffmpeg 命令
            cmd = [
                "ffmpeg", "-y", "-i", input_path,
                "-filter:a", filter_str,
                output_path
            ]

            print(f"🎧 正在处理：{file_name}（速度={self.speed}）")
            print("执行命令:", " ".join(cmd))

            subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

        print(f"✅ 所有音频处理完成，结果保存在：{self.output_dir}")
